//
//  CZNetworkTool.swift
//  微博08
//
//  Created by apple on 16/2/27.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
import AFNetworking

// 枚举是值类型
// 类是:指针,引用
enum CZNetworkToolError: Int {
    // 方式2:
    case AccessTokenEmpty = -1
    case UidEmpty = -2
    
    // 方式2:
    // 枚举可以有属性
    var errorMessage: String {
        get {
            switch self {
            case AccessTokenEmpty: return "access_token 没有值"
            case UidEmpty: return "Uid 没有值"
            }
        }
    }
    
    // 方式3: 将NSError的创建也封装到枚举里面
    // 枚举可以有方法
    func error() -> NSError {
        return NSError(domain: "cn.itcast.net", code: self.rawValue, userInfo: ["errorMessage" : self.errorMessage])
    }
}

class CZNetworkTool: NSObject {
    
    let afnManager: AFHTTPSessionManager
    
    // 单例
    static let sharedInstance: CZNetworkTool = CZNetworkTool()
    
    // private表示私有方法,除这个文件外的其它类是不知道这个方法的
    private override init() {
        let baseURL = NSURL(string: "https://api.weibo.com/")
        afnManager = AFHTTPSessionManager(baseURL: baseURL)
        
        afnManager.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        super.init()
    }
    
        // MARK: -Qauth授权相关
    let client_id = "343371560"
    let client_secret="97f6e91cd57afb2dd57b950bb1cb3434"
    let redirect_uri = "http://www.baidu.com/"
    let oauthUrl = "https://api.weibo.com/oauth2/authorize"

//    
    /// 获取oauth授权的登录界面地址
    func oauthLoginUrl() -> NSURL {
        let urlString = oauthUrl + "?" + "client_id=" + client_id + "&" + "redirect_uri=" + redirect_uri
        return NSURL(string: urlString)!
    }
    
    /// 获取Access Token
    func loadAccessToken(code: String, accessTokenFinished: finishedCallBack) {
        // 3.3.请求地址
        let urlString = "https://api.weibo.com/oauth2/access_token"
        
        // 3.4.请求参数
        let parameters = [
            "client_id": client_id,
            "client_secret": client_secret,
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": redirect_uri
        ]
        
        
        // 3.5发送POST请求
        afnManager.POST(urlString, parameters: parameters, progress: nil, success: { (_, response) -> Void in
            // 网络工具类只赋值加载数据,不负责处理数据
            // response as? [String: AnyObject]: 表示response有可能转成[String: AnyObject],也有可能转不成返回nil
            // response as! [String: AnyObject]: 表示response一定能转成[String: AnyObject],如果转不成功,程序崩溃
            let dict = response as? [String: AnyObject]
            // 3.6获取到数据,调用闭包
            accessTokenFinished(result: dict, error: nil)
            }) { (_, error) -> Void in
                accessTokenFinished(result: nil, error: error)
        }
    }
      /// 加载微博数据
    
    func loadUserInfo(finished: finishedCallBack) {
//        guard let access_token = CZUserAccountViewModel.sharedInstance.userAccount?.access_token else {
//            let error = CZNetworkToolError.AccessTokenEmpty.error()
//            finished(result: nil, error: error)
//            return
//        }
        
        // 4.判断uid
        guard let uid = CZUserAccountViewModel.sharedInstance.userAccount?.uid else {
            let error = CZNetworkToolError.UidEmpty.error()
            finished(result: nil, error: error)
            return
        }
        
        // 5.url
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        // 6.准备参数
        let parameters = ["uid": uid]
        
        // 7.发送请求
        requestGET(urlString, parameters: parameters, finished: finished)
//        afnManager.GET(urlString, parameters: parameters, progress: nil, success: { (_, result) -> Void in
//            // 8.调用闭包
//            finished(result: result as? [String: AnyObject], error: nil)
//            }) { (_, error) -> Void in
//                finished(result: nil, error: error)
//        }
    }
   //7-7-1
    /**
      加载微博数据
     
    - parameter since_id: 若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
    - parameter max_id:   若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
    - parameter finished: 完成时的闭包
     */

    func loadStatus(since_id: Int, max_id: Int,finished: finishedCallBack) {
        
        //8-3-1
         //是否要加载本地数据 true表示加载本地数据 false  表示加载微博数据
        let debug = false
        if debug {
            // 加载本地微博数据
            loadLacalStatus(finished)
            return
        }
        
        
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        
        // 添加请求参数
        var parameters = [String: AnyObject]()
        /// 别人传递了 since_id
        if since_id > 0 {
            parameters["since_id"] = since_id
        } else if max_id > 0 {
            //修改加速一个-1
             //7-8
            //因为初一个重复的数据加载的问题就解决的方法-1就可以了
            parameters["max_id"] = max_id - 1
        }

        requestGET(urlString, parameters: parameters, finished: finished)

    }
     // 8-3加载本地数据
    private func loadLacalStatus(finished: finishedCallBack){
        // 拿到路径
      let path = NSBundle.mainBundle().pathForResource("Status", ofType: "json")!
        
        //遇到问题 文件Status 一直报错了最后解决方法是删除文件重新添加
       let date = NSData(contentsOfFile: path)!
        //转成 json
        //try!:表示控制try很危险的如果tey后厨的代码出现异常直接崩坏
       let json = try! NSJSONSerialization.JSONObjectWithData(date, options: NSJSONReadingOptions(rawValue: 0))
        //打印 json
         print("json:\(json)")
        //调用闭包获取数据了
       finished(result:json as? [String : AnyObject], error: nil)
        //如果遇到错误异常怎么
        //方法
//        do {
//             let json = try! NSJSONSerialization.JSONObjectWithData(date, options: NSJSONReadingOptions(rawValue: 0))
//
//              print("json:\(json)")
//            //调用闭包获取数据了
//            finished(result:json as? [String : AnyObject], error: nil)
//        }catch{
//            print("出现异常走catch")
//        }
        
    }
    // 定义闭包
    typealias finishedCallBack = (result: [String: AnyObject]?, error: NSError?) -> ()
    // 现在所有的请求都是直接调用AFN的GET请求,如果有一天,AFN改了参数,或者项目改为其它网络框架,那么我们调用AFN.GET的地方都需要改动,将AFN.GET进行抽取
    
    /**
    封装AFN的GET请求
    
    - parameter urlString:
    - parameter parameters:
    - parameter finished:
    */
    // 以后调用GET请求直接使用这个方法,好处:1.requestGET会自动拼接access_token 2.当需要更换网络框架时只需要修改requestGET这一个方法就可以了
    private func requestGET(urlString: String, var parameters: [String: AnyObject]?, finished: finishedCallBack) {
        
        guard let access_token = CZUserAccountViewModel.sharedInstance.userAccount?.access_token else {
            // 方式3: 将NSError的创建也封装到枚举里面
            let error = CZNetworkToolError.AccessTokenEmpty.error()
            finished(result: nil, error: error)
            return
        }
        
        // 当别人没有传入请求参数,创建请求参数
        if parameters == nil {
            parameters = [String: AnyObject]()
        }
        
        // 给参数拼接access_token,添加 ["access_token": access_token]
        parameters!["access_token"] = access_token
        
        afnManager.GET(urlString, parameters: parameters, progress: nil, success: { (_, result) -> Void in
            finished(result: result as? [String : AnyObject], error: nil)
            }) { (_, error) -> Void in
                finished(result: nil, error: error)
        }
    }
}
//7-8加载更多微博书记
//7-9自己实现上拉加载更多数据思路
//8-3 本地数据加载